import axios from 'axios'
import type { AxiosInstance, AxiosRequestConfig } from 'axios'
import type { JCRequestConfig, JCInterceptors } from './type'

class JCRequest {
  // 定义一个私有变量instance，类型为AxiosInstance
  private instance: AxiosInstance
  // 定义一个可选变量interceptors，类型为JCInterceptors
  interceptors?: JCInterceptors

  // 构造函数，接收一个config参数，类型为JCRequestConfig
  constructor(config: JCRequestConfig) {
    // 使用axios.create方法创建一个axios实例，并将config传入
    this.instance = axios.create(config)
    // 将config中的interceptors赋值给interceptors变量
    this.interceptors = config.interceptors

    // 如果interceptors存在
    if (this.interceptors) {
      // 使用instance.interceptors.request.use方法，将requestSuccessFn和requestFailureFn传入
      this.instance.interceptors.request.use(
        this.interceptors?.requestSuccessFn,
        this.interceptors?.requestFailureFn
      )

      // 使用instance.interceptors.response.use方法，将responseSuccessFn和responseFailureFn传入
      this.instance.interceptors.response.use(
        this.interceptors?.responseSuccessFn,
        this.interceptors?.responseFailureFn
      )
    }
  }

  // 定义一个request方法，接收一个config参数，类型为AxiosRequestConfig
  request(config: AxiosRequestConfig) {
    // 使用instance.request方法，将config传入，并返回res.data
    this.instance.request(config).then((res) => {
      return res.data
    })
  }

  // 定义一个get方法，接收一个config参数，类型为JCRequestConfig
  get(config: JCRequestConfig) {
    // 使用request方法，将config和method为'GET'传入
    return this.request({ ...config, method: 'GET' })
  }

  // 定义一个post方法，接收一个config参数，类型为JCRequestConfig
  post(config: JCRequestConfig) {
    // 使用request方法，将config和method为'POST'传入
    return this.request({ ...config, method: 'POST' })
  }

  // 定义一个delete方法，接收一个config参数，类型为JCRequestConfig
  delete(config: JCRequestConfig) {
    // 使用request方法，将config和method为'DELETE'传入
    return this.request({ ...config, method: 'DELETE' })
  }

  // 定义一个put方法，接收一个config参数，类型为JCRequestConfig
  put(config: JCRequestConfig) {
    // 使用request方法，将config和method为'PUT'传入
    return this.request({ ...config, method: 'PUT' })
  }
}

export default JCRequest
